﻿using Essensoft.Paylink.Alipay;
using Essensoft.Paylink.Alipay.Domain;
using Essensoft.Paylink.Alipay.Notify;
using Essensoft.Paylink.Alipay.Request;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using SMARTHOTEL.AlipayViewModel;
using SMARTHOTEL.Payment;
using SMARTHOTEL.Reservationses;
using SMARTHOTEL.RoomStatues;
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;

namespace SMARTHOTEL.Alipay
{
    [ApiExplorerSettings(GroupName = "v3")]
    public class AlipayMethod : Controller
    {

        /// <summary>
        /// 支付宝支付
        /// </summary>

        private readonly ILogger logger;
        private readonly IAlipayNotifyClient _ccclient;
        private readonly IAlipayClient _client;
        private readonly IOptions<AlipayOptions> _optionsAccessor;





        public AlipayMethod(ILogger<AlipayMethod> logger, IAlipayNotifyClient ccclient, IAlipayClient client, IOptions<AlipayOptions> optionsAccessor)
        {
            this.logger = logger;
            _ccclient = ccclient;
            _client = client;
            _optionsAccessor = optionsAccessor;

        }






        /// <summary>
        /// 电脑网站支付
        /// </summary>
        /// <param name="viewModel"></param>
        [HttpPost("PagePay")]
        public async Task<IActionResult> PagePay(AlipayTradePagePayViewModel viewModel)
        {

            // 创建支付宝页面支付模型实例，并填充相应的字段。
            var model = new AlipayTradePagePayModel
            {
                Body = viewModel.Body, // 商品描述信息
                Subject = viewModel.Subject, // 订单标题
                TotalAmount = viewModel.TotalAmount, // 订单总金额
                OutTradeNo = viewModel.OutTradeNo, // 商户订单号，需要保证在商户系统内唯一
                ProductCode = "FAST_INSTANT_TRADE_PAY", // 产品码，表示使用即时到账产品
                                                        // 如果有自定义的产品码可以从viewModel中获取：viewModel.ProductCode
            };
            // 创建支付宝页面支付请求对象
            var req = new AlipayTradePagePayRequest();
            // 设置业务模型，即将之前设置的商品信息、订单信息等封装到请求中
            req.SetBizModel(model);
            // 设置异步通知地址，当支付成功后支付宝会向该地址发送POST请求通知支付结果
            req.SetNotifyUrl(viewModel.NotifyUrl);
            // 设置同步返回地址，支付完成后用户将被重定向到该地址
            req.SetReturnUrl(viewModel.ReturnUrl);

            PaymentRecords payment = new PaymentRecords()
            {

                PaymentId = viewModel.OutTradeNo,
                PaymentType = "支付宝网页支付",
                PaymentMethod = Convert.ToDecimal(viewModel.TotalAmount),
                PaymentUser = "Admin",
                Pay_status = PayStatus.未知状态,

            };


            // 调用支付宝客户端的PageExecuteAsync方法执行请求，_optionsAccessor.Value是配置项
            // 这里通过异步的方式调用支付宝接口，获取响应内容
            var response = await _client.PageExecuteAsync(req, _optionsAccessor.Value);
            // 返回支付宝返回的支付页面HTML内容给前端展示，Content方法用于指定返回的内容类型为text/html
            return Content(response.Body, "text/html", Encoding.UTF8);
        }


        /// <summary>
        /// 电脑网站支付异步通知
        /// </summary>

        [HttpPost("PagePayNotify")]
        public async Task<IActionResult> PagePayNotify()
        {
            try
            {
                var notify = await _ccclient.CertificateExecuteAsync<AlipayTradePagePayNotify>(Request, _optionsAccessor.Value);


                switch (notify.TradeStatus)
                {
                    case AlipayTradeStatus.Success: // 支付成功
                        logger.LogInformation("电脑网站支付异步通知-交易支付成功 => OutTradeNo: " + notify.OutTradeNo);
                        return AlipayNotifyResult.Success;
                    case AlipayTradeStatus.Closed: // 交易关闭
                        logger.LogInformation("电脑网站支付异步通知-未付款交易超时关闭，或支付完成后全额退款 => OutTradeNo: " + notify.OutTradeNo);
                        return AlipayNotifyResult.Success;
                    case AlipayTradeStatus.Finished: // 交易完结
                        logger.LogInformation("电脑网站支付异步通知-交易结束，不可退款 => OutTradeNo: " + notify.OutTradeNo);
                        return AlipayNotifyResult.Success;
                    default:
                        return AlipayNotifyResult.Failure;
                }
            }
            catch (AlipayException ex)
            {
                logger.LogWarning("出现异常: " + ex.Message);
                return AlipayNotifyResult.Failure;
            }
        }


        /// <summary>
        /// 手机网站支付入口点。此方法用于处理来自客户端的支付请求，并重定向用户到支付宝的支付页面完成支付。
        /// </summary>
        /// <param name="viewMode">包含支付信息的视图模型。</param>
        /// <returns>返回支付宝支付页面的HTML内容，以便在浏览器中展示支付界面。</returns>
        [HttpPost("WapPay")] // 定义HTTP POST路由"WapPay"来接收支付请求
        public async Task<IActionResult> WapPay(AlipayTradeWapPayViewModel viewMode)
        {
            // 创建支付宝手机网站支付模型实例，并根据传入的视图模型填充相关信息
            var model = new AlipayTradeWapPayModel
            {
                Body = viewMode.Body, // 商品描述信息
                Subject = viewMode.Subject, // 订单标题，显示在支付宝支付页面上
                TotalAmount = viewMode.TotalAmount, // 订单总金额，单位为元
                OutTradeNo = viewMode.OutTradeNo, // 商户订单号，必须保证在商户系统内唯一
                ProductCode = viewMode.ProductCode // 产品码，通常为"QUICK_WAP_WAY"，表示使用的是手机网站支付产品
            };

            // 创建支付宝手机网站支付请求对象
            var req = new AlipayTradeWapPayRequest();

            // 将业务模型设置到请求中，包括商品详情、订单信息等
            req.SetBizModel(model);

            // 设置支付成功后的异步通知地址（服务器后台接收），用于接收支付结果的通知
            req.SetNotifyUrl(viewMode.NotifyUrl);

            // 设置支付完成后用户的同步返回地址（前端跳转），支付完成后用户将被重定向到该地址
            req.SetReturnUrl(viewMode.ReturnUrl);

            // 调用支付宝客户端的PageExecuteAsync方法执行请求，传递请求对象和配置选项
            // 这里通过异步方式调用支付宝接口，获取响应内容
            var response = await _client.PageExecuteAsync(req, _optionsAccessor.Value);

            // 返回支付宝返回的支付页面HTML内容给前端展示，Content方法用于指定返回的内容类型为text/html
            return Content(response.Body, "text/html", Encoding.UTF8);
        }

    }
}
  